<?php
header("Content-Type: text/html;charset=utf-8");
// 引入class
include_once ("main.class.php");
$main = new main();
// 保存用户信息
if ($main->getUserInfo($_GET["token"]) === false){
    die;
}
$user_info = $main->getUserInfo($_GET["token"]);
$user_info_UID = $user_info['data']['uid'];// 用户UID
$user_info_nickName = $user_info['data']['nickName'];// 用户名字
$gacha_token = $main->ifUrl($_GET["token"]);

// 判断是否有data目录
if (!array_search('data',scandir(__DIR__),true)){
    mkdir('data',0777,true);
}
// 判断是否有已经有用户数据
$user_json_dir = __DIR__.'/data/'.$user_info_UID.'.json';
if (array_search($user_info_UID.'.json',scandir(__DIR__.'/data'),true)){
    $user_json = json_decode(file_get_contents($user_json_dir),true);
}
// 判断是token否为空
if ($gacha_token["encode"]){
    // 最大页数
    $gacha_max_pages = 15;
    // 抽卡数据API返回的内容
    $gacha_content = array();
    // 判断最每一页最新一抽的时间是否比已存储的内容更新
    for($gacha_pages = 1;$gacha_pages <=$gacha_max_pages;$gacha_pages++) {
        $gacha_content[] = json_decode(file_get_contents("https://ak.hypergryph.com/user/api/inquiry/gacha?page=$gacha_pages&token={$gacha_token["encode"]}"),true);
        if ($gacha_content[$gacha_pages-1]['data']['list']['0']['ts'] > $user_json['0']['time']){
            continue;
        }else{
            break;
        }
    }
    // 抽卡API返回的数据有几条（获取到了多少页
    $gacha_user_max_page = count($gacha_content);
    $out = array(
        'uid' => $user_info_UID,// UID
        'nickName' => $user_info_nickName,// 昵称
    );
    // 判断返回信息
    if($gacha_content[0]['msg'] !== ""){
        http_response_code(400);
        echo json_encode(array(
            "status" => false,
            "msg" => "错误，鹰角网络API返回信息：".$gacha_content[0]["msg"]."，错误代码：".$gacha_content[0]["code"]
        ),JSON_UNESCAPED_UNICODE);
        die;
    }
    // 遍历 页数
    for ($i = $gacha_user_max_page-1;$i >= 0;$i--){
        // 本页抽了多少次(十连和单抽都算一次)
        $for_gacha_num = count($gacha_content[$i]['data']['list']);
        // 遍历 本页面的每一次抽卡
        for ($ii = $for_gacha_num-1;$ii >= 0;$ii--){
            // 十连还是单抽
            $for_gacha_chars_num = count($gacha_content[$i]['data']['list'][$ii]['chars']);

            // 判断是十连还是单抽
            if ($for_gacha_chars_num > 1){
                // 遍历 十连的每一抽
                for ($iii = 0;$iii < $for_gacha_chars_num;$iii++){// 此时改为从0开始遍历（对应游戏中的十连每一抽的展示顺序）
                    // 每一个干员的临时存储
                    $gacha_list = array();
                    $gacha_list['time'] = $gacha_content[$i]['data']['list'][$ii]['ts'];// 抽取时间
                    $gacha_list['name'] = $gacha_content[$i]['data']['list'][$ii]['chars'][$iii]['name'];// 干员名
                    $gacha_list['rarity'] = $gacha_content[$i]['data']['list'][$ii]['chars'][$iii]['rarity']+1;// 干员稀有度
                    $gacha_list['pool'] = $gacha_content[$i]['data']['list'][$ii]['pool'];// 卡池名
                    $gacha_list['isNew'] = $gacha_content[$i]['data']['list'][$ii]['chars'][$iii]['isNew'];// 新干员？
                    // 添加到输出数组的前面
                    array_unshift($out,$gacha_list);
                }
                unset($iii);
            }else {
                // 单抽
                $gacha_list = array();
                $gacha_list['time'] = $gacha_content[$i]['data']['list'][$ii]['ts'];// 抽取时间
                $gacha_list['name'] = $gacha_content[$i]['data']['list'][$ii]['chars']['0']['name'];// 干员名
                $gacha_list['rarity'] = $gacha_content[$i]['data']['list'][$ii]['chars']['0']['rarity']+1;// 干员稀有度
                $gacha_list['pool'] = $gacha_content[$i]['data']['list'][$ii]['pool'];// 卡池名
                $gacha_list['isNew'] = $gacha_content[$i]['data']['list'][$ii]['chars']['0']['isNew'];// 新干员？
                // 添加到输出数组的前面
                array_unshift($out,$gacha_list);
            }
        }
        unset($ii);
    }
    unset($i);
}else{
    // $gacha_token结果为false
    echo json_encode(array(
        'status' => false,
        'msg' => 'token出错，这大概不是你的问题，请联系轩川浮华xuanchuanfuhua@qq.com反馈BUG'
    ),JSON_UNESCAPED_UNICODE);
    http_response_code(400);
    die;
}

// 添加新抽到的数据到$out
if ($user_json){
    // 获取已存储的文件中的最后一次抽卡时间
    $last_gacha_time = $user_json['0']['time'];
    // 遍历 从$out的倒数第3个元素开始(前两个分别是uid和nickName)
    for ($oi = count($out)-3; $oi >= 0; $oi--){
        // 判断遍历到的time是否大于最后一次抽卡时间
        if ($out[$oi]['time'] > $last_gacha_time){
            // 找到第一个时间大于最后一次插卡时间，将它和它前面的所有内容都保存到新的数组
            $a=array_slice($out,0,$oi+1);
            // 遍历 新抽卡数据
            for ($oii = count($a)-1;$oii >=0;$oii--){
                // 从前端插入到$user_json
                array_unshift($user_json,$a[$oii]);
            }
            // 如果符合条件进入if语句了，就终止这个for循环
            break;
        }
    }
    // 将已有新数据的$user_json赋值给$out以便后续输出
    $out = $user_json;
}
// 创建json文件
file_put_contents($user_json_dir,json_encode($out,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));

// 抽卡数据展示部分
// 写入UID和昵称
$pevOut = array(
    'uid' => $out['uid'],
    'nickName' => $out['nickName']
);
// 存储各卡池数据
$poolGacha = array();

// 先存入所有卡池的数据
$pevOut['所有卡池'] = array(
    'poolName' => '所有卡池',
    'r3Num' => 0,
    'r4Num' => 0,
    'r5Num' => 0,
    'r6Num' => 0,
    'gachaNum' => 0,
    'gachaLastR6Num' => null,
    'r5History' => array(),// 五星历史
    'r5avg' => 0,// 五星平均出率
    'r6History' => array(),// 六星历史
    'r6avg' => 0,// 六星平均出率
    'lastGacha' => 0,// 最后一次记录的抽卡时间
    'firstGacha' => 0// 最早的一次记录的抽卡时间
);
$poolGacha['所有卡池']['r5'] = array();
$poolGacha['所有卡池']['r6'] = array();
// 数据中已有的卡池名
$pool = array(
    '0' => '所有卡池'
);
// 遍历所有数据，将所有抽卡存入['所有卡池']，将各卡池数据存入各卡池数组
for ($i = 0;$i < count($out)-2; $i++){
    // 卡池名
    $poolName = $out[$i]['pool'];
    // 保证每个卡池数据中都有r5 r6数组
    if (!$poolGacha[$poolName]['r5']){
        $poolGacha[$poolName]['r5'] = array();// 预创建数组r5
    }
    if (!$poolGacha[$poolName]['r6']){
        $poolGacha[$poolName]['r6'] = array();// 预创建数组r6
    }
    // 先将这一抽数据存入$poolGacha['所有卡池']
    $poolGacha['所有卡池'][] = $out[$i];
    // 先将这一抽数据存入$poolGacha['所有卡池']
    $poolGacha[$poolName][] = $out[$i];

    // 判断当前遍历的一抽数据中的pool是否存在于$pevOut中
    if (!in_array($poolName,$pevOut)){
        // 存在则初始化模板
        $pevOut[$poolName] = array(
            'poolName' => $poolName,
            'r3Num' => 0,
            'r4Num' => 0,
            'r5Num' => 0,
            'r6Num' => 0,
            'gachaNum' => 0,
            'gachaLastR6Num' => 0,
            'r5History' => array(),// 五星历史
            'r5avg' => 0,// 五星平均出率
            'r6History' => array(),// 六星历史
            'r6avg' => 0,// 六星平均出率
            'lastGacha' => 0,// 最后一次记录的抽卡时间
            'firstGacha' => 0// 最早的一次记录的抽卡时间
        );
    }
    // 判断当前遍历的一条数据中的pool是否存在于$pool中
    if (!in_array($poolName,$pool)){
        // 否则写入
        $pool[] = $poolName;
    }
}
unset($i,$poolName);

for ($i = 0;$i < count($pool);$i++){
    // 当前遍历的卡池名
    $poolName = $pool[$i];
    $pevOut[$poolName]['poolName'] = $poolName;
    $pevOut[$poolName]['gachaNum'] = count($poolGacha[$poolName])-2;
    $pevOut[$poolName]['lastGacha'] = $poolGacha[$poolName]['0']['time'];
    $pevOut[$poolName]['firstGacha'] = $poolGacha[$poolName][count($poolGacha[$poolName])-3]['time'];
    for ($ii = 0;$ii < count($poolGacha[$poolName])-2;$ii++){

        $iRarity = $poolGacha[$poolName][$ii]['rarity'];
        switch ($iRarity){
            case "3":
                $pevOut[$poolName]['r3Num']++;
                break;
            case "4":
                $pevOut[$poolName]['r4Num']++;
                break;
            case "5":
                $pevOut[$poolName]['r5Num']++;
                $poolGacha[$poolName]['r5'][] = array(
                    'time' => $poolGacha[$poolName][$ii]['time'],
                    'name' => $poolGacha[$poolName][$ii]['name'],
                    'pool' => $poolGacha[$poolName][$ii]['pool'],
                    'isNew' => $poolGacha[$poolName][$ii]['isNew'],
                    'gachaNum' => count($poolGacha[$poolName]) - 2 - $ii,
                );
                break;
            case "6":
                // 所有卡池的六星数量
                $pevOut[$poolName]['r6Num']++;
                // 所有卡池的六星存入$poolGacha
                $poolGacha[$poolName]['r6'][] = array(
                    'time' => $poolGacha[$poolName][$ii]['time'],
                    'name' => $poolGacha[$poolName][$ii]['name'],
                    'pool' => $poolGacha[$poolName][$ii]['pool'],
                    'isNew' => $poolGacha[$poolName][$ii]['isNew'],
                    'gachaNum' => count($poolGacha[$poolName]) - 2 - $ii,
                );
                // 如果有六星，那就覆盖设定距离上一次六星有多少发
                if (!$pevOut[$poolName]['gachaLastR6Num']){
                    $pevOut[$poolName]['gachaLastR6Num'] = $ii;
                }
                break;
        }
    }
    // 将没有出六星的池子的距离上一次六星改成对应卡池的总抽卡数
    if (!$pevOut[$poolName]['gachaLastR6Num']){
        $pevOut[$poolName]['gachaLastR6Num'] = count($poolGacha[$poolName]) - 2;
    }
    rGachaHistory($poolName,'r6');
    rGachaHistory($poolName,'r5');

    // 如果距离上次六星出货次数与最后一次六星出货抽卡数相同啧清零
    if ($pevOut[$poolName]['gachaLastR6Num'] === $pevOut[$poolName]['r6History']['0']['gachaNum']){
        $pevOut[$poolName]['gachaLastR6Num']  = 0;
    }
}
unset($i,$ii);

// 计算5星、6星的两抽的间隔
function rGachaHistory ($p,$r) {
    global $poolGacha;
    global $pevOut;
    if (!$poolGacha[$p][$r]){
        //echo '$poolGacha['.$p.']['.$r.']不存在';
        return;
    }
    for ($i = 0; $i < count($poolGacha[$p][$r]);$i++) {
        if ($poolGacha[$p][$r][$i+1]){
            $gachaNum = $poolGacha[$p][$r][$i]['gachaNum'] - $poolGacha[$p][$r][$i+1]['gachaNum'];
        }else {
            $gachaNum = $poolGacha[$p][$r][$i]['gachaNum'];
        }
        $pevOut[$p][$r.'History'][] = array(
            'time' => $poolGacha[$p][$r][$i]['time'],
            'name' => $poolGacha[$p][$r][$i]['name'],
            'pool' => $poolGacha[$p][$r][$i]['pool'],
            'isNew' => $poolGacha[$p][$r][$i]['isNew'],
            'gachaNum' => $gachaNum
        );
    }
    // 5或6星计算平均出货次数
    $pevOut[$p][$r.'avg'] = round($poolGacha[$p][$r]['0']['gachaNum'] / count($poolGacha[$p][$r]),2);
}
// 将pool写入pevOut
$pevOut['pool'] = $pool;
echo json_encode($pevOut,JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
//print_r($pevOut);
